package lk.service.blogspringboot.util;

import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.SignatureException;
import lk.service.blogspringboot.exception.JwtException;

import java.util.Date;

/**
 * JWT 工具类，用于生成 Token
 */
public class JWTUtil {

    // 定义一个密钥，用于对 Token 进行签名，需要保密
    private static final String SECRET_KEY = "lkok545264...";

    // 设置 token 过期时间为 30 分钟（以毫秒为单位）   1800000ms=1800s=30min
    //private static final long EXPIRATION = 30 * 60 * 1000L;
    private static final long EXPIRATION = 30000 * 60 * 1000L;

    /**
     * 生成 Token 的方法
     * @param username 用户名
     * @return 生成的 Token 字符串
     */
    public static String generateToken(String username) {
        Date expireDate = new Date(System.currentTimeMillis() + EXPIRATION);

        // 使用 Jwts 库创建一个 Token 构建器
        return Jwts.builder()
                // 设置 Token 的主体为用户名
                .setSubject(username)
                // 设置超时时间
                .setExpiration(expireDate)
                // 使用指定的签名算法（HS256）和密钥进行签名
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                // 生成并返回紧凑格式的 Token 字符串
                .compact();}

    /**
     * 验证 Token 是否有效
     * @param token 要验证的 Token 字符串
     * @return 如果 Token 有效返回 true，否则返回 false
     */
    public static boolean validateToken(String token) {
        if (token == null || token.isEmpty()) {
            // 此为后端抛出异常
            throw new JwtException(400, "Token 不能为空,请重新登陆");
        }
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            return true;
        }
        catch (SignatureException e) {
            throw new JwtException(401, "Token 的签名不匹配，可能被篡改,请重新登陆");
        }
        catch (ExpiredJwtException e) {
            throw new JwtException(402, "token超时,请重新登陆");
        }
        catch (Exception e) {
            throw new JwtException(500, "验证过程中发生未知错误,请重新登陆");
        }
    }
}